' *************************************************************************** ' * * ' * This file is named 'MPUDEMO1.BAS' and was converted from the file * ' * MPUDEMO1.BAS created by By Gino Silvestri [71505,1436] for Turbo Basic. * ' * In addition it uses INOUT.DLL created By Bill Faggart [73075,645] that * ' * gives Visual Basic the ability to access ports. Both of these * ' * individuals are active on Compuserve * ' * There have been no major enhancements to this pgm just a straight port * ' * and the creation of a WAIT function for Visual Basic that mimics the * ' * WAIT function in Turbo Basic. * ' * * ' * Requirements: Requires VBRUN100.DLL and INOUT.DLL * ' * Note: INOUT.DLL must be either in your Windows directory or a directory * ' * on your path statement * ' * WARNING: If you don't HAVE an MPU-401 hooked up, program hangs up! * ' * * ' * Have Fun!! * ' * * ' * Michael Love Graves [72240,1123] * ' *************************************************************************** ' *************************************************************************** ' * D E F I N I T I O N S * ' *************************************************************************** DefInt A-Z ' Const True = -1 Const False = 0 Const ComdPort = &H331 ' MPU-401 Command Port on IBM Const statport = &H331 ' MPU-401 Status Port on IBM Const DataPort = &H330 ' MPU-401 Data I/O Port on IBM Const DRR = &H40 ' Mask for Data Read Reg. Bit Const DSR = &H80 ' Mask for Data Set Ready Bit Const ACK = &HFE ' MPU-401 Acknowledge Response Const maskflip = &HFF ' WAIT Function Bit Mask XOR Const MPUReset = &HFF ' MPU-401 Total Reset Command Const UARTMode = &H3F ' MPU-401 "Dumb UART Mode" Const NoteOn1 = &H90 ' MIDI Note On for Channel 1 Const Velocity = 64 ' MIDI Medium Key Velocity Const NoteOff = 0 ' 0 Velocity = Note Off Const FirstNote = 36 ' First note synth can play Const LastNote = 96 ' Last note synth can play ' *************************************************************************** ' * I N I T I A L I Z A T I O N * ' *************************************************************************** Sub RSTMPU () ' Reset the MPU-401 OUT ComdPort, MPUReset ' Send MPU-401 RESET Command a = INP(DataPort) ' Dummy read to clear buffer Wait statport, DRR, maskflip ' Wait for port ready OUT ComdPort, UARTMode ' Set MPU-401 "Dumb UART" Mode a = INP(DataPort) ' Dummy Read to clear buffer Wait statport, DSR, maskflip ' Wait for "UART" port ready - ' Really crucial!!!! End Sub ' *************************************************************************** ' * M A I N P R O G R A M * ' *************************************************************************** Sub MpuPlay () Form1.text1.text = " MPUDEMO1 playing a fast scale on MIDI Channel 1" For note = FirstNote To LastNote ' Ascending Scale Call Playit(note) ' Play a note Delay 3000 ' Duration of note ON Call Offit(note) ' Stop that same note Next ' Play next note Delay 4000 ' Pause between scales For note = LastNote To FirstNote Step -1 ' Descending Scales Call Playit(note) ' Play a note Delay 3000 ' Duration of note ON Call Offit(note) ' Stop that same note Next Delay 10000 ' Pause between demos Form1.text1.text = " MPUDEMO1 now playing some chords on MIDI Channel 1" For n = 1 To 3 ' Playing first chord thrice note = 65 ' F3 Call Playit(note) ' Start a chord note = 69 ' A3 Call Playit(note) note = 72 ' C4 Call Playit(note) Delay 14000 ' Duration of held chord note = 65 ' F3 Call Offit(note) ' Stop the chord note = 69 ' A3 Call Offit(note) note = 72 ' C4 Call Offit(note) Delay 14000 ' Duration of rest Next ' Play chord again note = 64 ' E3 Call Playit(note) ' Start last chord note = 67 ' G3 Call Playit(note) note = 72 ' C4 Call Playit(note) Delay 32000 ' Duration of held chord note = 64 Call Offit(note) ' Stop the chord note = 67 Call Offit(note) note = 72 Call Offit(note) Form1.text1.text = " MPUDEMO1 is through - Tinker with it!" End Sub ' ***************************** Playit SUBROUTINE *************************** Sub Playit (note As Integer) ' Play a MIDI Note OUT DataPort, NoteOn1 ' Send Chan. 1 note ON code a = INP(DataPort) ' Dummy Read to clear buffer * Wait statport, DRR, maskflip ' Wait for port ready OUT DataPort, note ' Send note Number to turn ON a = INP(DataPort) ' Dummy Read to clear buffer * Wait statport, DRR, maskflip ' Wait for port ready OUT DataPort, Velocity ' Send medium velocity a = INP(DataPort) ' Dummy Read to clear buffer * Wait statport, DRR, maskflip ' Wait for port ready End Sub Sub Offit (note) ' Turn off a MIDI Note '****************************** Offit routine ****************************** ' * Note: Read of DataPort prevents hang-up if MIDI IN from a keyboard is ' connected and played - WAIT would stay FOREVER if you hit any key once! OUT DataPort, NoteOn1 ' Send Chan. 1 note ON code a = INP(DataPort) ' Dummy Read to clear buffer * Wait statport, DRR, maskflip ' Wait for port ready OUT DataPort, note ' Send note number to turn OFF a = INP(DataPort) ' Dummy Read to clear buffer * Wait statport, DRR, maskflip ' Wait for port ready OUT DataPort, NoteOff ' Send 0 Velocity = Note Off a = INP(DataPort) ' Dummy Read to clear buffer * Wait statport, DRR, maskflip ' Wait for port ready End Sub Sub Delay (count) For x = 1 To count Next x End Sub ' ************************** WAIT subroutine ********************************** ' * This routine reads the statport, xor's the data with maskflip (0FFH) and * ' * ANDs it with DRR or DSR (MpuData). * ' ***************************************************************************** ' Sub Wait (statport, MpuData, maskflip) Statportbyte = INP(statport) ' Get any data at midi statport While ((Statportbyte Xor maskflip) And MpuData) = False ' Loop until either bit 6 or 7 ' (DRR or DSR) are set Statportbyte = INP(statport) ' Get data again if necessary Wend End Sub